﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using Microsoft.Xna.Framework;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionEco;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using System.Drawing;
using System.IO;

namespace Ecosystème
{
    public static class Traitements
    {

        public static List<EtreVivant> laListeEcosysteme;
        public static Plateau lePlateau;
        public static int[] taille;
        private static Random rand = new Random();
        public static int nbTours;
        public static int tourCourant;
        public static int indexDeIndividusCourant;
        public static bool start;

        public static void initialisation(ContentManager leContent)
        {
            start = false;
            nbTours = 100;
            tourCourant = 0;
            laListeEcosysteme = new List<EtreVivant>();
            lePlateau = new Plateau();
            int i = 0;

            //Génération des êtres vivant

            while (i < 10)
            {
                laListeEcosysteme.Add(new Cactus(true,5,5,3,System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\cactus.png")));
                i++;
            }

            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Chameau(true,100,5,8,2,6,7,200,200,3,System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chameau.png")));
                i++;
            }

            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Chat(true,30,5,12,2,8,7,50,50,3,System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chat.png")));
                i++;
            }

            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Chevre(true,70,5,7,2,8,7,50,50,3,System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chevre.png")));
                i++;
            }
            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Chien(true,40,8,8,2,8,7,50,50,10,System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chien.png")));
                i++;
            }

            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Loup(true,50,12,12,2,8,7,50,50,10,System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\loup.png")));
                i++;
            }

            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Pigeon(true,10,1,20,2,8,7,40,40,10,System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\pigeon.png")));
                i++;
            }

            i = 0;
            while (i < 10)
            {
                laListeEcosysteme.Add(new Requin(true,70,15,9,2,8,7,50,50,10 ,System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\requin.png")));
                i++;
            }

            i = 0;

            while (i < 10)
            {
                laListeEcosysteme.Add(new Tulipe(true,5,5,3,System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\tulipe.png")));
                i++;
            }

            //Transformation des images en textures


            i = 0;

            //Génération des terrains


            for (i = 0; i < taille[0]; i++)
            {
                lePlateau.LesCases.Add(new List<Case>());
                for (int j = 0; j < taille[1]; j++)
                {
                    switch (rand.Next(0,5))
                    {
                        case 1:
                            lePlateau.LesCases[i].Add(new Case(System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\Mer.jpg"),"Mer"));
                            break;
                        case 2:
                            lePlateau.LesCases[i].Add(new Case(System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\Plaine.jpg"), "Plaine"));
                            break;
                        case 3:
                            lePlateau.LesCases[i].Add(new Case(System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\Foret.jpg"), "Foret"));
                            break;
                        case 4:
                            lePlateau.LesCases[i].Add(new Case(System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\Montagne.jpg"), "Montagne"));
                            break;
                        default:
                            lePlateau.LesCases[i].Add(new Case(System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\Desert.jpg"), "Desert"));
                            break;
                    }
                }
            }

            //Association des etres vivants aux cases
            foreach (EtreVivant ev in laListeEcosysteme)
            {


                lePlateau.LesCases.ElementAt(rand.Next(0, taille[0] - 1)).ElementAt(rand.Next(0, taille[1]-1)).ListEVCase.Add(ev);

            }

            indexDeIndividusCourant = 0;

        }

        public static void actionEtreVivant()
        {
            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);

            if ((etreVivantEnCours.SoifActuelle + 10) >= (etreVivantEnCours.SoifMax))
            {
                etreVivantEnCours.SoifActuelle = etreVivantEnCours.SoifMax;
            }
            else
            {
                etreVivantEnCours.SoifActuelle += 10;
            }

            etreVivantEnCours.PointsActionActuels = 3;

            if (etreVivantEnCours.GetType().BaseType.Name.ToString().Equals("Vegetal") == false)
            {
                deplacerUnIndividus();
            }
            etreVivantEnCours.retraitPoints(1);


            if (etreVivantEnCours.PointsActionActuels > 0)
            {
                nourirUnIndividus();
                etreVivantEnCours.retraitPoints(1);
            }

            if (etreVivantEnCours.PointsActionActuels > 0)
            {
                desaltererUnIndividus();
                etreVivantEnCours.retraitPoints(1);
            }



            etreVivantEnCours.vieillir();

            if (etreVivantEnCours.VieActuelle <= 0)
            {
                tuerUnIndividus();
            }



            indexDeIndividusCourant++;
            if (indexDeIndividusCourant >= laListeEcosysteme.Count)
            {
                  indexDeIndividusCourant = 0;
            }
        }

        public static void deplacerUnIndividus()
        {
            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);

            Case laCaseSource = lePlateau.LesCases.ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.X / ((lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Width) * (lePlateau.Zoom)))).ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.Y / ((lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Height) * (lePlateau.Zoom))));

            Case laCaseCible;

            if ((((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.X / ((lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Width) * (lePlateau.Zoom))))+1) >= lePlateau.LesCases.Count)
            {

                laCaseCible = lePlateau.LesCases.ElementAt(0).ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.Y / ((lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Height) * (lePlateau.Zoom))));

            }
            else
            {
                laCaseCible = lePlateau.LesCases.ElementAt(((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.X / ((lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Width) * (lePlateau.Zoom)))) + 1).ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.Y / ((lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Height) * (lePlateau.Zoom))));
            }

            laCaseSource.ListEVCase.Remove(etreVivantEnCours);
            laCaseCible.ListEVCase.Add(etreVivantEnCours);
            Console.WriteLine(etreVivantEnCours.affichageConsole() + " : deplacement");
        }

        public static void nourirUnIndividus()
        {
            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);


            Console.WriteLine(etreVivantEnCours.affichageConsole() + " : nourris");
        }

        public static void desaltererUnIndividus()
        {
            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);
            Case laCaseSource = lePlateau.LesCases.ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.X / ((lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Width) * (lePlateau.Zoom)))).ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.Y / ((lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Height) * (lePlateau.Zoom))));

            if (laCaseSource.Terrain.QteEauActuelle > 0)
            {
                int aboire = laCaseSource.Terrain.QteEauActuelle;
                if (laCaseSource.Terrain.QteEauActuelle <= etreVivantEnCours.SoifActuelle)
                {
                    laCaseSource.Terrain.QteEauActuelle = 0;
                }
                else
                {
                    laCaseSource.Terrain.QteEauActuelle -= etreVivantEnCours.SoifActuelle;
                }

                etreVivantEnCours.boire(aboire);

                Console.WriteLine(etreVivantEnCours.affichageConsole() + " : desaltere");
            }
            else
            {
                if (etreVivantEnCours.SoifActuelle >= etreVivantEnCours.SoifMax)
                {
                    etreVivantEnCours.VieActuelle -= 15;
                }

                Console.WriteLine(etreVivantEnCours.affichageConsole() + " : plus deau sur le terrain, impossible de se desalterer");
            }


        }

        public static void tuerUnIndividus()
        {

            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);
            Case laCaseSource = lePlateau.LesCases.ElementAt((int)(etreVivantEnCours.LesCoordDeEtreVivant.Origine.X / 50)).ElementAt((int)(laListeEcosysteme.ElementAt(indexDeIndividusCourant).LesCoordDeEtreVivant.Origine.Y / 50));
            laCaseSource.ListEVCase.Remove(etreVivantEnCours);
            laListeEcosysteme.Remove(etreVivantEnCours);
            Console.WriteLine(etreVivantEnCours.NomEtre + " : mort");
        }


      }
    }
